package com.lb.io.heima.nio.buffer;

import org.junit.Test;

import java.nio.ByteBuffer;

/**
 * NIO缓冲区
 * Buffer常见方法
 * Buffer clear() 清空缓冲区并返回对缓冲区的引用
 * Buffer flip() 为 将缓冲区的界限设置为当前位置，
 * 并将当前位置充值为 0
 * int capacity() 返回 Buffer 的 capacity 大小
 * boolean hasRemaining() 判断缓冲区中是否还有元素
 * int limit() 返回 Buffer 的界限(limit) 的位置
 * Buffer limit(int n) 将设置缓冲区界限为 n,
 * 并返回一个具有新 limit 的缓冲区对象
 * Buffer mark() 对缓冲区设置标记
 * int position() 返回缓冲区的当前位置 position
 * Buffer position(int n) 将设置缓冲区的当前位置为 n，
 * 并返回修改后的 Buffer 对象
 * int remaining() 返回 position 和 limit 之间的元素个数
 * Buffer reset() 将位置 position 转到以前设置的mark
 * 所在的位置
 * Buffer rewind() 将位置设为为 0， 取消设置的 mark
 * <p>
 * 缓冲区的数据操作
 * Buffer 所有子类提供了两个用于数据操作的方法：get()put()
 * 方法取获取 Buffer中的数据
 * get() ：读取单个字节
 * get(byte[] dst)：批量读取多个字节到 dst 中
 * get(int index)：读取指定索引位置的字节(不会移动 position)
 * <p>
 * 放到 入数据到 Buffer 中 中
 * put(byte b)：将给定单个字节写入缓冲区的当前位置
 * put(byte[] src)：将 src 中的字节写入缓冲区的当前位置
 * put(int index, byte b)：将指定字节写入缓冲区的索引
 * 位置(不会移动 position)
 **/
public class BufferDemo {

    @Test
    public void test2(){
        //1. 分配一个指定大小的缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);

        //2. 利用 put() 存入数据到缓冲区中
        String name = "klhjdas";
        byteBuffer.put(name.getBytes());
        byteBuffer.flip();

        //读取数据
        byte[] bytes = new byte[2];
        byteBuffer.get(bytes);
        String rs = new String(bytes);
        System.out.println(rs);
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println("=====================");

        //标记此刻的位置
        byteBuffer.mark();

        byte[] bytes1 = new byte[3];
        byteBuffer.get(bytes1);
        String rs1 = new String(bytes1);
        System.out.println(rs1);
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println("=====================");

        byteBuffer.reset();
        if(byteBuffer.hasRemaining()){
            System.out.println(byteBuffer.remaining());
        }
    }

    @Test
    public void test1() {
        //1. 分配一个指定大小的缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println("=====================");

        //2. 利用 put() 存入数据到缓冲区中
        String name = "klhjdas";
        byteBuffer.put(name.getBytes());
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println("=====================");

        //3. 切换读取数据模式
        byteBuffer.flip();
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println("=====================");

        //4. 利用 get() 读取缓冲区中的数据
        char b = (char) byteBuffer.get();
        System.out.println(b);
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println("=====================");

    }

    @Test
    public void test3(){
        for(int i=0;i<255;i++){
            char a = (char) i;
            System.out.println(a+" "+i);
        }
    }
}
